/**
 * 给定一个整数数组 num 和一个整数目标值 target，请你在该数组中找出 和为目标值 target  的那 两个 整数，并返回它们的数组下标。
 *
 * 你可以假设每种输入只会对应一个答案。但是，数组中同一个元素在答案里不能重复出现。
 *
 * 你可以按任意顺序返回答案。
 *
 * 输入：num = [2,7,11,15], target = 9
 *
 * 输出：[0,1]
 *
 * 思想
 *
 * target - current = other
 *
 * 利用堆 存储 已经遍历过的下标和值 other
 *
 * 下标做 key 值 value  num = {0: xxx};
 *
 * 循环一次
 *
 * 从 num 获取 当前下标的值  curNum = num[0]
 *
 * target - curNum 得到 key
 *
 * 如果 curNum[key] 不为 undefined 即 得到 另外一个 数
 *
 * @see https://leetcode.cn/problems/two-sum/
 *
 * @param {number[]} num
 * @param {number} target
 */
function twoSum(num: number[], target: number) {
  // 存放出现过的数字，和对应的索引
  const map: Record<string, number | undefined> = Object.create(null)

  // 遍历每一项
  for (let i = 0; i < num.length; i++) {
    const element = num[i]
    // 希望从过去的数字中找到的呼应项
    const targetNum = target - element
    // 在 map 中找 targetNum 的索引
    const targetNumIndex = map[targetNum]

    if (targetNumIndex !== undefined) {
      // 直接返回 targetNumIndex 和当前的 i
      return [targetNumIndex, i]
    }

    // 如果找不到，说明之前没出现过 targetNum
    map[element] = i
  }
}

console.log(twoSum([2, 7, 11, 15], 9))
